%+-------------------------------+
%| ESQUELETO DE PROYECTO : ACEMU |
%+-------------------------------+

\documentclass[a4paper,12pt,notitlepage]{article}
\usepackage[ansinew]{inputenc}
\usepackage[spanish]{babel}
\usepackage[OT1]{fontenc}
\usepackage{graphics}
%\usepackage[nofiglist,notablist]{endfloat}

% ---------------------------------------------------------------------------
% INCLUSION DE IMAGENES Y TABLAS :
%
% ------------>> IMAGENES
%
%  + usar formato jpg.
%  + tener las imagenes en el mismo directorio de trabajo del documento.
%  + se incluyen con la siguiente sintaxis (recortar y pegar sacando
%    los comentarios - signos %| - y rellenar con los datos especificados :
%
%  \begin{figure}
%     \centering
%     \rotatebox{ROTACION}{
%     \scalebox{ESCALA}{
%     \includegraphics{NOMBRE_DEL_ARCHIVO}}}
%     \caption{TITULO DE LA FIGURA.> \label{ALIAS}}
%  \end{figure}
%
% ------------>> TABLAS
%
%  \begin{table}[htbp]
%     \centering
%     \begin{tabular}{ALINEACION}
%       <ACA_VA_LA_TABLA>
%     \end{tabular}
%     \caption{TITULO DE LA TABLA. \label{ALIAS}}
%  \end{table}
%
%------------------------------------------------------------------------------
%+--------------------------------------+
%|PRIMERO : PREAMBULO                   |
%+--------------------------------------+
%| Rellenar con : - TITULO DEL PROYECTO |
%|                - EJERCICIO           |
%+--------------------------------------+
\title{PROYECTO : Alt\'{i}metro XXXXX \\ Que el foro defina el nombre}
\date{Versi\'on preliminar *ALFA* - Septiembre de 2006}
\author{}

\begin{document}
\maketitle

%+-------------------------------------------+
%|SEGUNDO :                                  |
%+-------------------------------------------+
%| Escribir el ABSTRACT/RESUMEN del proyecto |
%+-------------------------------------------+
\begin{abstract}
%Aca comienza el ABSTRACT.
Se describen los requerimientos para la construcci\'on de un
alt\'{i}metro digital de bajo costo para ser usado en coheter\'{i}a experimental.

PALABRAS CLAVE : ALTIMETRO PRESION ALTURA COHETES DIGITAL ELECTRONICA
\end{abstract}

\section{OBJETIVOS.}

\subsection{General.}

Dise\~nar y construir un alt\'{i}metro digital de bajo costo para uso en coheter\'{i}a
experimental con las siguientes caracter\'{i}sticas:

\begin{itemize}

  \item Detecci\'on de despegue barom\'etrica por software.
  \item Estimaci\'on de altura m\'axima del vuelo.
  \item Dos eventos para el despliegue del sistema de recuperaci\'on:
        
        \begin{enumerate}
           \item Drogue por detecci\'on de apogeo y suma de tiempo modificable por software.
           \item Principal por programaci\'on interna de altura de despliegue.
        \end{enumerate}

  \item Interfase ac\'ustica para comunicar estados del sistema y la altura
  m\'axima lograda.

  \item Control de continuidad de las cargas de eyecci\'on.

\end{itemize}

\subsection{Espec\'{i}ficos.}

Caracter\'{i}sticas t\'ecnicas:
  
\begin{enumerate}

  \item Opci\'on de alimentaci\'on doble:
        
        \begin{enumerate}    
           \item Principal compartida con el sistema de eyecci\'on.
           \item Principal y alimentaci\'on independiente para las cargas de eyecci\'on.
        \end{enumerate}

  \item Sensor barom\'etrico Motorola MPX5100A

  \item Plataforma de control basada en PIC12F675 en su versi\'on PDIP con la
  siguiente configuraci\'on de pins:
  
        \begin{verbatim}                          
                             PIC12F675
                      +------------+
              VDD >---+            +---<VSS
                      |            |
            Buzzer<---+ GP5    GP0 +---< Test eyeccion drogue
                      |            |
  Sensor MPX5100A >---+ AN3    GP1 +---< Test eyeccion principal
                      |            |
Eyeccion principal<---+ GP3    GP2 +---> Eyeccion drogue
                      |            |
                      +------------+          
        \end{verbatim}

  \item Programaci\'on en assembler con la sint\'axis de Microchip. 
  
  \item Dise\~no del circuito y trazado del impreso hecho en la versi\'on
  gratuita de Eagle.

  \item  Construcci\'on de impresos de simple faz por transferencia t\'ermica.

  \item  Toda la informaci\'on generada ser\'a distribuida en formatos estandard (ascii
  plano, pdf, open document, etc).

\end{enumerate}

Items a definir :

\begin{itemize}

  \item Definici\'on del tipo de licencia para la distribuci\'on de todo el
  desarrollo.

  \item Armar una recopilaci\'on de todas las herramientas de software que se
  usen para ser distribuidas.

  \item Creaci\'on de un protocolo para las pruebas en tierra de validaci\'on
  del sistema.

  \item Construcci\'on de los sistemas necesarios para cumplir con el protocolo.
 
  \item Armar una lista de los proveedores de electr\'onica. 
  
  \item Evaluar la posibilidad de certificaci\'on metrol\'ogica del
  instrumento haciendo un relevamiento de las instituciones que pueden emitir
  este tipo de certificados, costos, requerimientos, etc.

\end{itemize}

\section{Estimaci\'on de los recursos necesarios.}

\subsection{Recursos humanos.}

Definici\'on de los equipos de personas necesarios para el
proyecto:\footnote{Los nombres que aparecen son solamente los que estan
confirmados para las diferentes tareas. A medida que aparezcan m\'as personas
se actualizar\'an las listas.}

\begin{description}

   \item [Desarrollo de software] Tabar\'e P\'erez (DMTt)
   \item [Desarrollo de la electr\'onica] Marcelo Hacker (DMTt)
   \item [Validaci\'on del sistema] Diego Cappri (DMTt), Marcelo Hacker
   (DMTt), Tabar\'e P\'erez (DMTt)

\end{description}

En la medida de lo posible anotar las horas horas hombre trabajadas para
incluirlas dentro del presupuesto del proyecto.

\subsection{Recursos materiales.}

Armar la lista de materiales y los precios.

\end{document}

===================================================
Se describen los requerimientos y etapas de desarrollo y construcci\'on de un
alt\'{i}metro digital de bajo costo para ser usado en coheter\'{i}a experimental.

PALABRAS CLAVE : ALTIMETRO PRESION ALTURA COHETES DIGITAL ELETRONICA
\end{abstract}

%+-------------------------------------------+
%|TERCERO :                                  |
%+-------------------------------------------+
%|Escribir Objetivos : - GENERAL             |
%|                     - ESPECIFICOS         |
%+-------------------------------------------+

\section{OBJETIVOS.}

   \subsection{General.}
   %Objetivo general (conceptual) del proyecto.

Dise\~nar y construir un alt\'{i}metro digital de bajo costos para uso en coheter\'{i}a
experimental con las siguientes caracter\'{i}sticas:

\begin{enumerate}
\item Funciones primarias :
  \begin{itemize}
  \item Estimaci\'on de altura m\'axima del vuelo.
  \item Dos eventos para el despliegue del sistema de recuperaci\'on:
    \begin{enumerate}
    \item Piloto por detecci\'on de apogeo.
    \item Principal por programaci\'on interna de altura de despliegue.
    \end{enumerate}
  \item Interfase ac\'ustica para comunicar estados del sistema y la altura
  m\'axima lograda.
  \item Control de continuidad de las cargas de eyecci\'on.
  \end{itemize}
\item Caracter\'{i}sticas t\'ecnicas:
  \begin{itemize}
  \item Sensor barom\'etrico.
  \item Opci\'on de alimentaci\'on doble:
    \begin{enumerate}
    \item Principal compartida con el sistema de eyecci\'on.
    \item Principal y alimentaci\'on independiente para las cargas de eyecci\'on.
    \end{enumerate}
  \item Plataforma de control basada en PIC con las siguientes
  caracter\'{i}sticas:
  \begin{enumerate}
  \item Tecnolog\'{i}a DIP con el menor footprint posible.
  \item Oscilador interno.
  \item Conversor A/D incorporado.
  \end{enumerate}
  \end{itemize}
\end{enumerate}

\subsection{Espec\'{i}ficos.}

%Lista de objetivos especificos si los hay.

Para la construcci\'on del prototipo:
\begin{itemize}
\item Definir de la plataforma PIC a usar.
\item Definir el lenguaje de programaci\'on y compilador para el
  proyecto.
\item Selecci\'on de las herramienatas de grabaci\'on de los programas en las
  plataformas PIC.
\item Definir las herramientas de software para el desarrollo de la
  electr\'onica y el circuito impreso.
\item Desarrollar o adaptar tecnolog\'{i}as apropiadas y de bajo costo para
  construcci\'on de circuitos impresos.
\item Definir los formatos para el intercambio de la informaci\'on.
\item Crear un protocolo para las pruebas en tierra de validaci\'on
  del sistema.
\item Construir las herramientas necesarias para cumplir con el protocolo.
\item Una vez definidas todas las herramientas de software a ser usadas, armar
  una recopilaci\'on de las mismas para ser distribuidas.
\item Armar una lista de los proveedores de electr\'onica. 
\end{itemize}
   
  
%+------------------------------------------------------------------------+
%| CUARTO :                                                               |
%+------------------------------------------------------------------------+
%| Describir los RECURSOS HUMANOS Y MATERIALES que se estiman necesarios. |
%+------------------------------------------------------------------------+
\section{Estimaci\'on de los recursos necesarios.}

   \subsection{Recursos humanos.}
   \begin{itemize}
   \item Coordinador general.
   \item Equipo para el desarrollo del software.
   \item Equipo para el desarrollo y prueba de la electr\'onica.
   \item Equipo para la construcci\'on de las unidades.
   \item Equipo para la validaci\'on del sistema.
   \end{itemize}

   \subsection{Estimaci\'on de los materiales necesarios.}
   \begin{itemize}
   \item Instrumentaci\'on electr\'onica.
   \item Computadoras.
   \item Talleres para mec\'anica liviana.
   \end{itemize}
 
%+-------------------------------------------------+
%|QUINTO :                                         |
%+-------------------------------------------------+
%| Escribir los antecedentes y/o la justificación. |
%+-------------------------------------------------+
\section{Antecedentes y/o justificaci\'on.}

Breve rese\~na sobre el desarrollo de los alt\'{i}metros.

Justificaci\'on del por qu\'e desarrollar una unidad propia de estas
caracter\'{i}sticas.

%+----------------------------------------------+
%| SEXTO :                                      |
%+----------------------------------------------+
%| Enumerar los proyectos asociados si los hay. |
%+----------------------------------------------+
\section{Proyectos asociados.}

Enumeraci\'on de los proyectos asociados si los hay.

%+---------------------------------------------------+
%| SEPTIMO :                                         |
%+---------------------------------------------------+
%| Descripcion del plan de trabajo para el proyecto. |
%+---------------------------------------------------+
\section{Plan de trabajo.}

En la medida de lo posible desarrollar un plan de trabajo marcando hitos,
tiempos, recursos humanos, etc.

%+---------------------------------------------------+
%| OCTAVO :                                          |
%+---------------------------------------------------+
%| Estimacion del presupuesto a asignar al proyecto. |
%+---------------------------------------------------+
\section{Dise\~no del presupuesto.}

Se deben de tener en cuenta los siguientes elementos para definir los costos
del proyecto:

\begin{itemize}
\item Microcontrolador PIC elegido.
\item Transistores de potencia.
\item Buzzer.
\item Sensor de presi\'on.
\item Llave de encendido.
\item Resistencias.
\item Condensadores.
\item Componentes activos si los hay (amplificadores operacionales).
\item Terminales de conexi\'on..
\item Terminal de alimentaci\'on.
\item Pertinax o equivalente.
\item Percloruro f\'errico o equivalente.
\item Horas hombre.
\end{itemize}
%+--------------------------------------+
%| NOVENO :                             |
%+--------------------------------------+
%|Comentarios varios sobre el proyecto. |
%+--------------------------------------+

\section{Notas.}

\end{document}

\begin{verbatim}

Reingenier\'{i}a de gesti\'on de interrupciones.

Definici\'on de cantidad de muestras por unidad de tiempo para la
carrera de subida (15/seg) y definici\'on de conveniencia de bajar esa
frecuencia de muestreo (2/seg)en la carrera de bajada.

Detecci\'on de despegue por diferencia de presi\'on o por switch.

Marcado del despegue como un "punto de partida" en el buffer circular
de memoria, para c\'alculos de altura y de deployment de main.

Marcado del apogeo como un "punto de referencia" en el buffer circular
de memoria, para c\'alculos de altura y de deployment de main.

Manejo de main por diferencia de presi\'on, con respaldo por tiempo.

Traducci\'on de estados y altura m\'axima a c\'odigos de beeps.

Con las notas de Tabare abro un nuevo topico para tratar este tema del
algoritmo para el altimetro con deployment.-
A ver si puedo colaborar, Tabare.- Mis notas dicen "Nota de GD:"

El armado del sistema es solamente por tiempo. Me gustaria que fuese
por deteccion de una clavija y por tiempo con aviso acustico y optico
(led de alto brillo).

Nota de GD: El armado por tiempo no esta mal, de hecho la mayoría por
no decir todos- los Computadores de Vuelo (en adelante los llamare
"CV", para abreviar) son asi.- Al encenderlos corren una rutina de
comprobacion que generalmente alerta al usuario del estado de cosas
mediante senales acusticas; al finalizar la rutina, indica continuidad
en los canales de salida si encuentran alli conectados a los
correspondientes ignitores.- Los LEDS de alto brillo consumen mucho y
a pesar de su brillo, pueden no verse a pleno sol y requieren de un
diseno de la bahia de avionica que permita verlos, en cambio, un
buzzer piezoelectrico se oye siempre a traves de los orificios de
venteo en el fuselaje, necesarios para cualquier altimetro
barometrico- y consumen muy poco.- Voto por un buzzer y senales
acusticas.-
Volviendo al armado, para mejorar la seguridad, lo que todos los
fabricantes de CV's aconsejan es no conectar directamente las cargas
de eyeccion al CV, sino disponer de algun sistema de interruptor
mecanico (clavija extraible) que se acciona de modo inmediatamente
previo al despegue, con el cohete "vivo" (armado, en plataforma y en
posicion de disparo) y nunca antes.- De mas está decir que nadie usa
este tipo de seguridad accesoria y personalmente creo que si el diseno
del CV es bueno, es suficiente con encender el CV con el cohete
"vivo" (armado, en plataforma y en posicion de disparo) y listo.- En
el hipotetico caso de una eyeccion prematura, no habra peligro.-


La eyeccion del segundo paracaidas se hace por tiempo. Me gustaria que
fuese por altura con respaldo de tiempo.

Nota de GD: Coincido: es MUY rudimentario hacer un accionamiento por
tiempo, aunque seria aceptable si se ahorra algo, memoria, por
ejemplo.- Si no se piensa guardar en memoria ningun valor de
presion/altura para poder descargar en tierra, para accionar un
segundo paracaidas ("main") basta con "recordar" dos o tres valores:
el de la presion en tierra, el de la minima presion/maxima altura
(donde dispararemos el primer paracaidas, más conocido como "piloto" o
"drogue") y el valor preseteado de presion/altura en el cual
deseamos disparar el paracaidas "main"; este valor se sustraera de la
escala de presion tierra/apogeo y listo: alli se debe accionar el
"main".- Es MUY recomendable que este valor sea seleccionable y en la
mayoria de los CV comerciales eso se puede hacer directamente en campo
mediante un banco de llaves, con tres o cuatro valores posibles que
generalmente estan en el rango de los 200 y 600 metros.- De este modo,
si el cohete tiene un apogeo de por  ejemplo- unos 1200 metros,
podemos eyectar un streamer o un pequeno paracaidas piloto para traer
nuestro cohete auna cota más baja y recien alli "largar todo el trapo"...


No me gusta el armado/desarmado por RF.
Nota de GD: ABSOLUTAMENTE INNECESARIO Y TOTALMENTE INACEPTABLE.- Y
menos si no es una senal altamente codificada.-

El software no tiene un tratamiento cuidadoso de la
habilitacion/deshabilitacion de las interrupciones. Este es un aspecto
mas tecnico que me gustaria explicar para los que no tienen
experiencia con los PIC. Es recomendacion del fabricante (Microchip)
que, cuando se habilitan o deshabilitan las interrupciones en los PIC,
nos quedemos en un loop de espera hasta que efectivamente el bit al
cual estamos poniendo en 0 o en 1 quede en el valor esperado. Parece
bobo pero, cuando uno trabaja con interrupciones, hay momentos de
incertidumbre de estados que pueden hacer que el sistema se comporte
de una forma no deseada o sencillamente se cuelgue. Imaginen sus
consecuencias. Los problemas de este tipo tienen una baja probabilidad
que sucedan pero hay que cubrirse programando defensivamente. Esto lo
digo respaldado en mi experiencia de campo. Las viejas leyes del
innombrable se cumplen ....

Nota de GD: Aconsejo tratar las interrupciones (concepto dificil para
los no sistemicos) con cuidado.- No tengo experiencia en PIC, dejo el
tema para los que mas saben.-


El algoritmo de deteccion de apogeo es muy sencillo. En mis primeros
pensamientos sobre altimetros surgían muchas herramientas matematicas
de modelación super complicadas de implementar en un micro. Sigo
pensando lo mismo pero siendo esta una primera aproximacion al
problema voto por no complicar este algoritmo. Cuando avancemos mas en
el tema iremos mejorando este aspecto.

Nota de GD: Es que el algoritmo de deteccion de apogeo para un
altimetro barometrico no puede ser demasiado complicado, aunque no es
del todo trivial.- Ejemplo: supongamos que seleccionamos una
frecuencia de muestreo de 5 tomas por segundo; si en cuatro segundos
(veinte muestras) obtenemos valores ascendentes de presion, podemos
decir que eso es apogeo, y eso sirve si solo se trata de un
altimetro... pero supongamos que se trata de un CV y estamos usando
eyeccion simple, me pregunto Y si quince muestras son ascendentes,
las restantes cinco son descendentes y luego tenemos otras diez en
descenso, y asi? Se detecta el apogeo o hay que filtrar? Es
suficiente con cuatro segundos / veinte muestras? Cuanto acelera un
cohete en cuatro segundos? Y si nunca se detuvo (trayectoria en
arco), bastara con cuatro segundos para asumir el apogeo? Que pasa si
en una trayectoria en arco nuestro algoritmo nunca asume el apogeo o
lo asume tarde, eyectando a velocidades elevadas con respecto al aire
circundante?

Edgardo escribe :

1) El armado del sistema es solamente por tiempo. Me gustaria que fuese por
deteccion de una clavija y por tiempo con aviso acustico y optico (led de alto
brillo).
 
En el caso del Fenix 01 el armado requeria de dos condiciones

* un junper que cortocirciuitaba los pines de entrada salida de comunicacion
con la pc una rutina de soft verificaba esto.

* la deteccion del "puesto en la rampa".

Luego de un reset y con las condiciones anteriores  entendia "listo para volar".
Creo que falta una clavija en algun lugar que abra la alimentacion de los pirotecnicos.

2) La eyeccion del segundo paracaidas se hace por tiempo. Me gustaria que
fuese por altura con respaldo de tiempo.
 
De acuerdo. Suppngo cuando te referis a respaldo por tiempo estas diciendo
luego del despegue o de la apertura del primer paracaida, en tantos segundos
abre si o si.
 
3) No me gusta el armado/desarmado por RF.

De acuerdo es peligroso e innecesario.

4) El software no tiene un tratamiento cuidadoso de la
habilitacion/deshabilitacion de las interrupciones. Este es un aspecto mas
tecnico que me gustaría explicar para los que no tienen experiencia con los
PIC. Es recomendación del fabricante (Microchip) que, cuando se habilitan o
deshabilitan las interrupciones en los PIC, nos quedemos en un loop de espera
hasta que efectivamente el bit al cual estamos poniendo en 0 o en 1 quede en
el valor esperado. Parece bobo pero, cuando uno trabaja con interrupciones,
hay momentos de incertidumbre de estados que pueden hacer que el sistema se
comporte de una forma no deseada o sencillamente se cuelgue. Imaginen sus
consecuencias. Los problemas de este tipo tienen una baja probabilidad que
sucedan pero hay que cubrirse programando defensivamente. Esto lo digo
respaldado en mi experiencia de campo. Las viejas leyes del innombrable se
cumplen ....
 
ASi es...

5) El algoritmo de deteccion de apogeo es muy sencillo. En mis primeros
pensamientos sobre altimetros surgian muchas herramientas matematicas de
modelacion super complicadas de implementar en un micro. Sigo pensando lo
mismo pero siendo esta una primera aproximacion al problema voto por no
complicar este algoritmo. Cuando avancemos mas en el tema iremos mejorando
este aspecto.
 
Aqui hay un tema importante .. no creo que alcance con cada tiempo requerir al
AD una medicion y darla como valida....  en particular me gustaria que el AD
mida lo mas que pueda y con esas mediciones hacer algun tratamiento.. quizas
un promedio seria suficiente pero se pueden pensar cosas mas complejas.

Gente,

Coincido con la apreciacion de Taba. De hecho.. hace un rato le pase un
mail con un comentario/consulta precisamente al respecto.

El criterio que considero habria que adoptar deberia ser mas o menos como el
siguiente:

Respecto al armado, yo le pondria alternativamente que sea por "clavija",
jumper, etc. y a su vez (optiativamente) por deteccion de despegue. Si no me
equivoco, el perfectflite se arma a partir de haber superado los 50mts (o
algo asi). La idea seria que en modo "stand-by", y segun el jumper, estaria
esperando la apertura del mismo o en caso de haber seleccionado "por
despegue", estaria esperando llegar a la altitud de: "nivel del suelo +
50mts" para iniciar el registro "oficial" de altitud, así como armar los
eventos de apertura de drogue y principal.

Proyecto Fenix

Este programa corre en un 16f819.

Toma la la lectura de la entrada RA0 y despues con ella modula un tono.

Con este programa mas un "link" (wenshing 8mW) -> antena yagui y un
convertidor tono -RS232 se bajaron los datos del pdf adjunto.  El grafico
muestra la altitud en el tiempo donde (a menos de una calibración poco
presisa) se ven la carrera ascenso y bajada en paracaidas.etc un analisis un
poco mejor nos da para comenzar a pensar en un monton de cosas....  La
electronica es básicamente un amplificador que la experiencia demostro ser
demasiado sensible (se median variaciones del metro) lo que ensucio bastante
todo. vi por algun lado un circuito donde se colgaba el sensor directo a una
entrada AD. ¿ Algun memorioso?  El AD del micro es de 10 bit. esto implica
resolucion de 5 mV/bit. y el sensor esta entregando maso 6 mV/psi con lo cual
es necesario amplificar. la salida diferencial del sensor he aqui un problema
si no se tiene fuente partida.. alguna idea?
  

-- 
EdGardo

;Programa "MIDE Y MANDA". LEE RA2
;Proyecto CanSat. ORT, Mayo de 2006.
;Por D. Gonzalo Gluzman.
;
;Este programa mide la entrada analogica de RA0 y la envia por modulacion de
;tonos. RF mediante telemetria.
;Se queda en un ciclo infinito midiendo y enviando.

INDF equ 0x00 ;Registro de data de direccionamiento indirecto
TMR0 equ 0x01 ;Registro de conteo del TIMER0
PCL equ 0x02 ;Bits 0-7 del contador de programa
STATUS equ 0x03 ;Registro de estados
FSR equ 0x04 ;Registro de ADRES de direccionamiento indirecto
PORTA equ 0x05 ;Puerto A
PORTB equ 0x06 ;Puerto B
PCLATH equ 0x0A ;Bits 8-12 del contador de programa
INTCON equ 0x0B ;Control de interrupciones
PIR1 equ 0x0C ;Flags de interrupciones perifericas (registro 1)
PIR2 equ 0x0D ;Flags de interrupciones perifericas (registro 2)
TMR1L equ 0x0E ;Byte bajo del TIMER1
TMR1H equ 0x0F ;Byte alto del TIMER1
T1CON equ 0x10 ;Control del TIMER1
TMR2 equ 0x11 ;Registro de conteo del TIMER2
T2CON equ 0x12 ;Control del TIMER2
SSPBUF equ 0x13 ;Buffer de TX/RX del puerto serie
SSPCON equ 0x14 ;Registro de control del puerto serie
CCPR1L equ 0x15 ;Byte bajo del mod. Capture/Compare/PWM
CCPR1H equ 0x16 ;Byte alto del mod. Capture/Compare/PWM
CCP1CON equ 0x17 ;Byte del control del mod. Capture/Compare/PWM
ADRESH equ 0x1E ;Dos bits más altos de la medicion AD
ADCON0 equ 0x1F ;Primer registro de control del AD

OPTION1 equ 0x01 ;Registro OPTION
TRISA equ 0x05 ;Configuracion del Puerto A
TRISB equ 0x06 ;Configuracion del Puerto B
PIE1 equ 0x0C ;Habilitación de interrupciones perifericas (R. 1)
PIE2 equ 0x0D ;Habilitación de interrupciones perifericas (R.2)
PCON equ 0x0E ;Registro de control de poder (alimentacion)
OSCCON equ 0x0F ;Control del oscilador
OSCTUNE equ 0x10 ;Puesta a punto del oscilador
PR2 equ 0x12 ;Registro de periodo del TIMER2
SSPADD equ 0x13 ;Direcciones del puerto serie
SSPSTAT equ 0x14 ;Registro de estados del puerto serie
ADRESL equ 0x1E ;Bits 0-7 de la medicion AD
ADCON1 equ 0x1F ;Segundo registro de control del AD

EEDATA equ 0x0C ;Registro bajo de DATA EEPROM
EEADR equ 0x0D ;Registro bajo de direccionamiento EEPROM
EEDATAH equ 0x0E ;Registro alto de DATA EEPROM
EEADRH equ 0x0F ;Registro alto de direccionamiento EEPROM

EECON1 equ 0x0C ;Control de EEPROM1
EECON2 equ 0x0D ;Control de EEPROM2

#define CARRY STATUS,0 ;Flag de acarreo de bytes
#define DC STATUS,1 ;Flag de acarreo de nibbles
#define CERO STATUS,2 ;Flag de resultado aritmetico 0
#define PD STATUS,3 ;Bit de alimentacion baja (Power down)
#define TO STATUS,4 ;Bit de tiempo fuera (Time-Out)
#define RP0 STATUS,5 ;Bit bajo selector de banco de memoria
#define RP1 STATUS,6 ;Bit alto selector de banco de memoria
#define IRP STATUS,7 ;Bit selector de banco de memoria para direccionamiento
indirecto

#define RBIF INTCON,0 ;Flag de interrupcion por cambio de estado en RB7:RB4
#define INTF INTCON,1 ;Flag de interrupcion por cambio de estado en RB0
#define TMR0IF INTCON,2 ;Flag de interrupcion por desborde del TIMER0
#define RBIE INTCON,3 ;Habilitacion de interrupciones en RB7:RB4
#define INTE INTCON,4 ;Habilitacion de interrupciones en RB0
#define TMR0IE INTCON,5 ;Habilitacion de interrupciones por desborde del TIMER0
#define PEIE INTCON,6 ;Habilitacion de interrupciones perifericas
#define GIE INTCON,7 ;Habilitacion (global) de todas las interrupciones

#define TMR1IF PIR1,0 ;Flag de TIMER1 desbordado
#define TMR2IF PIR1,1 ;Flag de "ciclo completo" por TIMER2
#define CCP1IF PIR1,2 ;Flag de interrupcion por CCP (CC)
#define SSPIF PIR1,3 ;Flag de interrupcion por el puerto serie
#define ADIF PIR1,6 ;Flag de interrupcion por el AD

#define EEIF PIR2,4 ;Flag de interrupcion por lectoescritura EEPROM

#define TMR1ON T1CON,0 ;Habilita al TIMER1
#define TMR1CS T1CON,1 ;Selecciona la fuente de pulsos para el TIMER1
#define T1SYNC T1CON,2 ;Sincronizacion de pulso externo para TIMER1
#define T1OSCEN T1CON,3 ;Habilitacion del oscilador para TIMER1
#define T1CKPS0 T1CON,4 ;Bit 0 de prescaler para TIMER1
#define T1CKPS1 T1CON,5 ;Bit 1 de prescaler para TIMER1

#define T2CKPS0 T2CON,0 ;Bit bajo de prescaler para TIMER2
#define T2CKPS1 T2CON,1 ;Bit alto de prescaler para TIMER2
#define TMR2ON T2CON,2 ;On/Off de TIMER2
#define TOUTPS0 T2CON,3 ;Bit 0 de postscaler para TIMER2
#define TOUTPS1 T2CON,4 ;Bit 1 de postscaler para TIMER2
#define TOUTPS2 T2CON,5 ;Bit 2 de postscaler para TIMER2
#define TOUTPS3 T2CON,6 ;Bit 3 de postscaler para TIMER2

#define SSPM0 SSPCON,0 ;Bit 0 de modo de puerto serie
#define SSPM1 SSPCON,1 ;Bit 1 de modo de puerto serie
#define SSPM2 SSPCON,2 ;Bit 2 de modo de puerto serie
#define SSPM3 SSPCON,3 ;Bit 3 de modo de puerto serie
#define CKP SSPCON,4 ;Bit seleccionador de polaridad en clock
#define SSPEN SSPCON,5 ;Habilita el puerto serie
#define SSPOV SSPCON,6 ;Flag de desborde en recepcion
#define WCOL SSPCON,7 ;Flag de colision al escribir

#define CCP1M0 CCP1CON,0 ;Bit 0 selector de modo de funcionamiento de CCP
#define CCP1M1 CCP1CON,1 ;Bit 1 selector de modo de funcionamineto de CCP
#define CCP1M2 CCP1CON,2 ;Bit 2 selector de modo de funcionamiento de CCP
#define CCP1M3 CCP1CON,3 ;Bit 3 selector de modo de funcionamiento de CCP
#define CCP1Y CCP1CON,4 ;Dos (bajo) bits altos de ciclo util de PWM
#define CCP1X CCP1CON,5 ;Dos (alto) bits altos de ciclo util de PWM

#define ADON ADCON0,0 ;On/Off del AD
#define ADGO ADCON0,2 ;Inicia conversion AD
#define CHS0 ADCON0,3 ;Bit 0 selccionador de canal AD
#define CHS1 ADCON0,4 ;Bit 1 selccionador de canal AD
#define CHS2 ADCON0,5 ;Bit 2 selccionador de canal AD
#define ADCS0 ADCON0,6 ;Bit 0 de prescaler para conversiones AD
#define ADCS1 ADCON0,7 ;Bit 1 de prescaler para conversiones AD

#define PS0 OPTION1,0 ;Bit 0 de prescaler
#define PS1 OPTION1,1 ;Bit 1 de prescaler
#define PS2 OPTION1,2 ;Bit 2 de Prescaler
#define PSA OPTION1,3 ;Bit asignador de prescaler (0=TMR1-1=WDT)
#define T0SE OPTION1,4 ;Selector de flanco para TIMER0
#define T0CS OPTION1,5 ;Fuente del clock para TIMER0 (0=4/Fosc)
#define INTEDG OPTION1,6 ;Flanco de interrupcion para RB0
#define RBPU OPTION1,7 ;Resistencias de pull-up (0=habilitadas-1=inhabilitadas)

#define TMR1IE PIE1,0 ;Habilita interrupciones por desborde del TIMER1
#define TMR2IE PIE1,1 ;Habilita interrupciones por "ciclo completo" del TIMER2
#define CCP1IE PIE1,2 ;Habilita interrupciones del mod. CCP
#define SSPIE PIE1,3 ;Habilita interrupciones del puerto serie
#define ADIE PIE1,6 ;Habilita interrupciones del AD

#define EEIE PIE2,4 ;Habilita interrupcion por lectoescritura EEPROM

#define BOR PCON,0 ;Flag de reset
#define POR PCON,1 ;Flag de corte de alimentacion

#define IOFS OSCCON,2 ;Bit de estabilidad de frecuencia para oscilador interno
#define IRCF0 OSCCON,4 ;Bit 0 de frecuencia para oscilador interno
#define IRCF1 OSCCON,5 ;Bit 1 de frecuencia para oscilador interno
#define IRCF2 OSCCON,6 ;Bit 2 de frecuencia para oscilador interno

#define TUN0 OSCTUNE,0 ;Bit 0 de tuneo de frecuencia del oscilador
#define TUN1 OSCTUNE,1 ;Bit 1 de tuneo de frecuencia del oscilador
#define TUN2 OSCTUNE,2 ;Bit 2 de tuneo de frecuencia del oscilador
#define TUN3 OSCTUNE,3 ;Bit 3 de tuneo de frecuencia del oscilador
#define TUN4 OSCTUNE,4 ;Bit 4 de tuneo de frecuencia del oscilador
#define TUN5 OSCTUNE,5 ;Bit 5 de tuneo de frecuencia del oscilador

#define BF SSPSTAT,0 ;Buffer completo (fin de TX/RX)
#define UA SSPSTAT,1 ;Indica que el usuario necesita actualizar la direccion
#define R_W SSPSTAT,2 ;Informacion de lectura/escritura
#define S SSPSTAT,3 ;Bit de START ultimo en ser detectado
#define P SSPSTAT,4 ;Bit de STOP ultimo en ser detectado
#define D_A SSPSTAT,5 ;Indica que el ultimo byte recivido fue data/adress
#define CKE SSPSTAT,6 ;Flanco para TX/RX de datos
#define SMP SSPSTAT,7 ;Fase de muestreo de datos SPI

#define PCFG0 ADCON1,0 ;Bit 0 configurador de pines
#define PCFG1 ADCON1,1 ;Bit 1 configurador de pines
#define PCFG2 ADCON1,2 ;Bit 2 configurador de pines
#define PCFG3 ADCON1,3 ;Bit 3 configurador de pines
#define ADCS2 ADCON1,6 ;Bit 2 de prescaler para conversiones AD
#define ADFM ADCON1,7 ;Justificacion del resultado AD

#define RD EECON1,0 ;Inicia la lectura EEPROM
#define WR EECON1,1 ;Inicia la escritura EEPROM
#define WREN EECON1,2 ;Habilta la escritura EEPROM
#define WRERR EECON1,3 ;Flag de error durante la escritura EEPROM
#define FREE EECON1,4 ;Borra una linea de programa apuntada por EEADR en la
sig. esc.
#define EEPGD EECON1,7 ;Acceso a la memoria de Programa (1)/Data (0)

RAM1     equ 0x20 ;Registro RAM
RAM2     equ 0x21 ;Registro RAM
RAM3     equ 0x22 ;Registro RAM
RAM4     equ 0x23 ;Registro RAM
RAM5     equ 0x24 ;Registro RAM
RAM6     equ 0x25 ;Registro RAM
RAM7     equ 0x26 ;Registro RAM
RAM8     equ 0x27 ;Registro RAM
RAM9     equ 0x28 ;Registro RAM
RAM10    equ 0x29 ;Registro RAM
BUFFER   equ 0x2A ;Registro usado para transmiciones
CHANEL   equ 0x2B ;Registro usado para indicar canal de conversion AD
ADbL     equ 0x2C ;Resultado AD (8 bits más bajos)
ADbH     equ 0x2D ;Resultado AD (2 bits más altos)
D_SEND_H equ 0x2E ;Registro usado para mandar datos a tierra
D_SEND_L equ 0x2F ;Registro usado para mandar datos a tierra
TX_H     equ 0x30 ;Registro usado para enviar RF a tierra

#define ANTENA PORTB,4 ;Pin a donde se conectara la antena

;-------------------------------------------------------------------------------

EMPIEZA goto CONFIG1 ;Configura los puertos.
        nop ;No hace nada en las instruccciones que restan
        nop ;hasta la sección de interrupciones.
        nop ;....

;-------------------------------------------------------------------------------

        org 0x04             ;Empieza a escribir desde la direccion de
                             ;programa 0x04 que es la de interrupciones.
INT     movf STATUS,0        ;Copia el valor de STATUS
        movwf RAM5           ;a un registro RAM para despues recuperarlo
TIMER0                       ;Interrupcion por timer modo comunicacion RF.
                             ;Oscila a la antena a una frecuencia determinada
                             ;por el dato a enviar.
       movf TX_H,0           ;Si TX_H=0, el programa se dirije a FIN_PULSO
       btfsc CERO            ;
       goto FIN_PULSO        ;
       decfsz TX_H, 1        ;TX_H=TX_H-1, cuando llega a cero va a LC,
       goto RETORNA          ;sino vuelve
       goto LC               ;

FIN_PULSO ;
          movf D_SEND_H,0    ;Carga la parte alta a mandar
          movwf TX_H         ;en TX_H
          btfss ANTENA       ;Si el RF_PIN estan en bajo
          goto UP            ;lo sube, si está en alto
          goto DOWN          ;lo baja

UP ;
          bsf ANTENA         ;Sube el RF_PIN
          goto RETORNA       ;Vuelve

DOWN ;
          bcf ANTENA         ;Baja el RF_PIN
          goto RETORNA       ;Vuelve

LC ;
         comf D_SEND_L, 0    ;Carga el comlemento de D_SEND_L
         movwf TMR0          ;en TMR0
         goto RETORNA        ;Vuelve

RETORNA  bcf TMR0IF          ;Baja el flag de interrupcion por TIMER0
         movf RAM5,0         ;Recupera el valor de STATUS para que la interrupcion
         movwf STATUS        ;no cause errores en el programa
         retfie              ;Retorna a la seccion de programa en la que estaba

;-------------------------------------------------------------------------------

CONFIG1 bsf RP0            ;Pasa al banco 1 de memoria
        bcf RP1            ;
        movlw b'01000000'  ;Configura OPTION con r. de pullups habilitadas,
        movwf OPTION1      ;TIMER0 con pre en 1:2.
        movlw b'11100000'  ;Configura INTCON prendiendo el TIMER1 y
        movwf INTCON       ;habilitando las interrupciones generales.
        clrf TRISB         ;Configura todo el puerto B como salidas
        movlw b'00011111'  ;Configura los cinco bits más bajos de RA
        movwf TRISA        ;como entradas.
        movlw b'10000000'  ;Configura todas las AN como entradas analogicas,
        movwf ADCON1       ;la justificacion a la derecha y la velocidad de conversion.
        bcf RP0            ;Pasa al banco 0 de memoria
        movlw b'01010001'  ;Selecciona el canal AD y la velocidad de conversion.
        movwf ADCON0       ;Enciende el convertidor AD
        goto INICIO        ;Empieza el programa

;-------------------------------------------------------------------------------
;Se queda leyendo la entrada AD.

INICIO call AD          ;Llama a la subrutina de conversion AD
       call WAIT        ;Espera 50 milisegundos
       goto $-2         ;por tiempo infinito

;--------------------------------------------------------------------------------
;Lee la entrada AD y coloca el resultado en el buffer que es enviado a tierra
;por modulación de tonos.

AD     bsf ADGO         ;Inicia la conversion AD
       btfsc ADGO       ;Espera a que termine.
       goto $-1         ;
       movf ADRESH,0    ;Copia el resultado alto a otro registro
       movwf D_SEND_H   ;
       bsf RP0          ;Copia el resultado bajo a otro resgistro
       movf ADRESL,0    ;(en el banco cero)
       bcf RP0          ;
       movwf D_SEND_L   ;
       return           ;Vuelve

;-------------------------------------------------------------------------------
;Espera 50 ms.

WAIT movlw d'50'       ;Carga RAM4 con 20 que equivale a
     movwf RAM4        ;la cantidad de ms a demorar
     TOP2 movlw d'110' ;Carga RAM3 con 110 que equivale a
     movwf RAM3        ;la cant. de ciclos para perder 1ms.
TOP1 nop               ;Pierde tiempo
     nop               ;En total 6us en los nop’s y
     nop               ;9us (en total) incluyendo todo.
     nop
     nop
     nop
     decfsz RAM3,1     ;resta 1 a RAM3 saltea el goto sig.
     goto TOP1         ;si llega a 0
     decfsz RAM4,1     ;Resta 1 a RAM4 saltea el goto sig.
     goto TOP2         ;si llega a 0
     return            ;Retorna al punto inferior del CALL

\end{verbatim}

\end{document}

%%% Local Variables: 
%%% mode: plain-tex
%%% TeX-master: t
%%% End: 
